package com.nbst.controller.base;

import javax.transaction.xa.XAException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.DeadlockLoserDataAccessException;
import org.springframework.dao.RecoverableDataAccessException;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import com.atomikos.icatch.RollbackException;
import com.nbst.comnutil.LogOut;
import com.nbst.comnutil.NormalResult;

/**
 * @ClassName: ExceptionController
 * @Description:全局异常捕获
 * @author King
 * @date 2020年4月26日
 * 
 */
@RestControllerAdvice
public class ExceptionController {

	@Autowired
	LogOut logout;

	/**
	 * 捕获校验异常
	 * 
	 * @param e
	 * @return NormalResult
	 * @author King
	 * @date 2020年4月26日
	 */
	@ExceptionHandler(BindException.class)
	public NormalResult MethodArgumentNotValidExceptionHandler(BindException e) {
		NormalResult result = new NormalResult();
		// 从异常对象中拿到ObjectError对象
		ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
		// 然后提取错误提示信息进行返回
		result.setMessage(objectError.getDefaultMessage());
		return result;
	}

	/**
	 * 捕获数据库死锁异常
	 * 
	 * @param e
	 * @return NormalResult
	 * @author King
	 * @date 2020年4月26日
	 */
	@ExceptionHandler(DeadlockLoserDataAccessException.class)
	public NormalResult MethodArgumentNotValidExceptionHandler(DeadlockLoserDataAccessException e) {
		NormalResult result = new NormalResult("9999", "操作失败");
		logout.error(e);
		result.setMessage("当前操作用户较多，系统未能执行您的操作，请您稍后再试");
		return result;
	}

	/**
	 * 捕获事务回滚异常
	 * 
	 * @param e
	 * @return NormalResult
	 * @author King
	 * @date 2020年4月26日
	 */
	@ExceptionHandler(RollbackException.class)
	public NormalResult MethodArgumentNotValidExceptionHandler(RollbackException e) {
		NormalResult result = new NormalResult("9999", "操作失败");
		result.setMessage("操作异常！");
		logout.error(result.getMessage() + e);
		return result;
	}

	/**
	 * 捕获事务回滚异常
	 * 
	 * @param e
	 * @return NormalResult
	 * @author King
	 * @date 2020年4月26日
	 */
	@ExceptionHandler(DataAccessResourceFailureException.class)
	public NormalResult MethodArgumentNotValidExceptionHandler(DataAccessResourceFailureException e) {
		NormalResult result = new NormalResult("9999", "操作失败");
		result.setMessage("本次访问数据库失败，请稍候再试!若连续多次出现，请向管理员反应");
		logout.error(result.getMessage() + e);
		return result;
	}

	/**
	 * 捕获事务回滚异常
	 * 
	 * @param e
	 * @return NormalResult
	 * @author King
	 * @date 2020年4月26日
	 */
	@ExceptionHandler(RecoverableDataAccessException.class)
	public NormalResult MethodArgumentNotValidExceptionHandler(RecoverableDataAccessException e) {
		NormalResult result = new NormalResult("9999", "操作失败");
		result.setMessage("网络出现波动，导致连接数据库失败，请稍后再试");
		logout.error(result.getMessage() + e);
		return result;
	}

	/**
	 * 捕获事务回滚异常
	 * 
	 * @param e
	 * @return NormalResult
	 * @author King
	 * @date 2020年4月26日
	 */
	@ExceptionHandler(XAException.class)
	public NormalResult MethodArgumentNotValidExceptionHandler(XAException e) {
		NormalResult result = new NormalResult("9999", "操作失败");
		result.setMessage("由于硬件限制，数据库查询出现性能瓶颈！请避开高峰期操作，或多试几次");
		logout.error(result.getMessage() + e);
		return result;
	}

}
